package system

import (
	"a-admin/web/resp"
	"fmt"
	"io"
	"mime/multipart"
	"os"
	"sync"

	"github.com/gofiber/fiber/v2"
)

var (
	sysCommControllerTemp *SysCommController
	sysCommControllerOnce sync.Once
)

type SysCommController struct{}

// NewSysCommController 公共接口
func NewSysCommController() *SysCommController {
	sysCommControllerOnce.Do(func() {
		sysCommControllerTemp = &SysCommController{}
	})
	return sysCommControllerTemp
}

// Upload 上传
func (m *SysCommController) Upload(c *fiber.Ctx) error {
	// 获取上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		return err
	}

	// 打开上传的文件
	src, err := file.Open()
	if err != nil {
		return err
	}
	defer func(src multipart.File) {
		err := src.Close()
		if err != nil {
			fmt.Println("close err:", err.Error())
		}
	}(src)

	folderPath := "./uploads"
	// 检查文件夹是否存在
	if _, err := os.Stat(folderPath); os.IsNotExist(err) {
		// 文件夹不存在，创建文件夹
		err := os.Mkdir(folderPath, 0755)
		if err != nil {
			return err
		}
	}

	// 创建文件
	dst, err := os.Create(folderPath + "/" + file.Filename)
	if err != nil {
		return err
	}
	defer func(dst *os.File) {
		_ = dst.Close()
	}(dst)

	// 将文件内容复制到目标文件中
	if _, err = io.Copy(dst, src); err != nil {
		return err
	}
	return resp.Ok(c)
}

// Download 下载
func (m *SysCommController) Download(c *fiber.Ctx) error {
	// 获取下载文件的路径
	filename := c.Params("filename")
	filepath := "./uploads/" + filename

	// 读取文件内容
	file, err := os.ReadFile(filepath)
	if err != nil {
		return err
	}

	// 设置响应头，告诉浏览器这是一个可下载的文件
	c.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename))
	return c.Send(file)
}
